package JavaSE.ThreadLearning.SynchronizedLearning.ProducerAndConsumer;

/**
 * 笼子类
 * 存放包子数据
 * 提供判断笼子是否为空
 */
public class Box {
    // 包子
    Food food;
    // 生产者生产包子的方法 只有生产者执行
    public synchronized void setFood(Food newFood) {
        // 判断蒸笼是否为空
        if (food == null) {
            //如果为空，说明没有包子
            food = newFood;
            System.out.println(Thread.currentThread().getName()
                    + "生产了" + newFood);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //生产包子，并且通知消费者来吃
            this.notify();
        } else {
            //如果蒸笼非空，说明有包子
            //阻止自己
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    // 消费者吃包子的方法  只有消费者执行
    public synchronized void eatFood() {
        // 判断蒸笼是否为空
        if (food == null) {
            //如果为空，说明没有包子
            //阻止自己
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        } else {
            //如果非空，说明有包子
            //吃包子，并且通知生产者去生产包子
            System.out.println(Thread.currentThread().getName()
                    + "吃了" + food);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            food = null;
            notify();
        }
    }
}
// 包子类
class Food {
    String name;
    int price;

    public Food(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String toString() {
        return "包子：" + this.name + "，价格：" + this.price + "元";
    }
}

